var ws = null; // 建立的连接
var lockReconnect = false;// 是否真正建立连接
var timeout = 1000;// 30秒一次心跳
var timeoutObj = null;// 心跳心跳倒计时
var serverTimeoutObj = null;// 心跳倒计时
var timeoutnum = null;// 断开 重连倒计时
var global_callback = null; // 监听服务端消息
// uri: 长链接地址// callback: 服务端消息回调函数
export function createWebSocket(callback) {
    global_callback = callback;
    if (ws == null || typeof ws !== WebSocket) {
        initWebSocket();
    }
}
export function initWebSocket() {
    var userId = sessionStorage.getItem('session_id');
    var wsuri = window.server.SERVER_API[3].socket + userId;
    ws = new WebSocket(wsuri);
    ws.onopen = () => {
        lockReconnect = true;
        // 开启连接心跳
        start();
    };

    ws.onmessage = onMessage;
    ws.onerror = onError;
    ws.onclose = onClose;
    ws.onsend = sendSock;
}

// 发送消息
export function sendSock(message) {
    console.log(`发送消息： ${message}`);
    if (ws.readyState === ws.OPEN) {
        // 若是ws开启状态
        ws.send(message);
    } else if (ws.readyState === ws.CONNECTING) {
        // 若是 正在开启状态，则等待1s后重新调用
        setTimeout(function() {
            sendSock(message);
        }, 1000);
    } else {
        // 若未开启 ，则等待1s后重新调用
        setTimeout(function() {
            sendSock(message);
        }, 1000);
    }
}

// 接受服务端消息
export function onMessage(res) {
  let msgData = res.data;
  if (typeof msgData != 'object' && msgData != 'word') {
   // 服务端消息回掉
    global_callback(msgData);
  }
  // 重置心跳
  reset();
}

// 连接失败
export function onError() {
  console.log('连接失败');
  ws.close();
  ws = null;
  lockReconnect = false;
}

// 连接关闭
export function onClose() {
  console.log('连接关闭');
}
// 断开关闭
export function closeSock() {
  if (lockReconnect) {
    ws.close();
    ws = null;
    lockReconnect = false;
  }
}

// 发送心跳
export function start() {
  timeoutObj && clearTimeout(timeoutObj);
  serverTimeoutObj && clearTimeout(serverTimeoutObj);
  timeoutObj = setTimeout(function() {
    // 这里发送一个心跳，后端收到后，返回一个心跳消息
    console.log('发送心跳');
    if (ws.readyState == 1) { // 如果连接正常
      ws.send('hello');
    } else { // 否则重连
      reconnect();
    }
    serverTimeoutObj = setTimeout(function() {
      // 超时关闭
      ws.close();
    }, timeout * 10);
  }, timeout * 50);
}
// 重置心跳
export function reset() {
  // 清除时间
  clearTimeout(timeoutObj);
  // 清除时间
  clearTimeout(serverTimeoutObj);
  start(); // 重启心跳
}

// 重新连接
export function reconnect() {
  if (lockReconnect) {
    return;
  }
  lockReconnect = true;
  // 没连接上会一直重连，设置延迟避免请求过多
  timeoutnum && clearTimeout(timeoutnum);
  timeoutnum = setTimeout(function() {
    initWebSocket();// 新连接
    lockReconnect = false;
  }, 5000);
}
